﻿#pragma once

#include "EditorPageAreaViewModel.h"
#include "EditorPageAreaManagerModel.m.h"


class REditorPageModel;
class REditorPageAreaModel;
class REditorSplitableLayoutNode;
class REditorSplitableLayoutModel;

//管理页面区域
RCLASS(ExtraHeader="Widgets/Splitable/EditorSplitableLayoutModel.h")
class REditorPageAreaManagerModel : public RObject
{
    ROBJECT

public:
    virtual void FirstTimeInitializeObject() override;

    //聚焦到指定的页面区域,这个区域是聚焦页面所在的区域
    //可以为空
    void FocusPageArea(TSharedObjectPtr<REditorPageAreaModel> InPageArea);
    //可能为空
    //如果为空，表示没有任何页面
    TSharedObjectPtr<REditorPageAreaModel> GetFocusedPageArea() const;

    //获取当前的页面，也就是聚焦的页面区域中的前台页面,如果没有页面，返回空
    TSharedObjectPtr<REditorPageModel> GetCurrentPage() const;
    void NofifyCurrentPageChanged();

    //在指定的父区域中插入一个页面
    void AddPageInArea(
        TSharedObjectPtr<REditorPageAreaModel> InArea
        ,TSharedObjectPtr<REditorPageModel> InPage
        ,bool bPutInFront 
      );

    //在聚焦区域插入一个页面
    //如果当前没有聚焦区域，那就创建一个
    void AddPageInDefaultArea(
        TSharedObjectPtr<REditorPageModel> InPage
        ,bool bPutInFront );


    //将传入的页面区域分割到右侧
    void SplitToRight(TSharedObjectPtr<REditorPageAreaModel> InAreaToSplit);
    //将传入的页面区域分割到下方
    void SplitToDown(TSharedObjectPtr<REditorPageAreaModel> InAreaToSplit);


    //关闭指定区域的指定页面
    void ClosePage(
        TSharedObjectPtr<REditorPageAreaModel> InArea
        ,int64_t InPageIndex
    );

    //替换指定页面
    void ReplacePage(
      TSharedObjectPtr<REditorPageModel> Old
      ,TSharedObjectPtr<REditorPageModel> New);


    //清除所有的页面和子区域
    void ClearAll();

protected:
    //在区域树中，当前关注的区域
    //当打开新页面时，默认在这个区域中打开
    RFIELD()
    TSharedObjectPtr<REditorPageAreaModel> FocusedPageArea;

public:
    TSharedObjectPtr<REditorSplitableLayoutModel> GetLayout() const { return LayoutModel; }
protected:

    RFIELD()
    TSharedObjectPtr<REditorSplitableLayoutModel> LayoutModel;

    TSharedObjectPtr<REditorPageAreaModel> FindFirstPageArea(TSharedObjectPtr<REditorSplitableLayoutNode> InNode);
};